package merchants

import (
	"gitee.com/theegg/go-brick/app/model"
	"gitee.com/theegg/go-brick/app/model/partner/partner_admin/partner_admin_users"
	"gitee.com/theegg/go-brick/app/service/app"
	"strconv"
	"time"
)

// 查询参数
type MerchantQueryParams struct {
	PageSize  string `form:"page_size" json:"page_size"  binding:"gte=0,lte=100" label:"每页数量"`
	PageIndex string `form:"page_index" json:"page_index"  binding:"gte=0,lte=99999" label:"当前页数"`
	Title     string `form:"title" json:"title"  binding:"" label:"商户名"`
}

// 添加参数
type MerchantAddParams struct {
	Id      int64  `form:"id" binding:"" label:"ID"`
	Name    string `form:"name"  binding:"required,min=2,max=36" label:"商户名"`
	Summary string `form:"summary"  binding:"required,min=2,max=128" label:"商户简介"`
}

// 分页获取所有数据
// @param params map 参数
// @return interface{}, error
func GetDataList(params map[string]interface{}) (map[string]interface{}, error) {
	returnData := make(map[string]interface{}, 0)

	queryParams, errBuild := model.BuildAdminQueryParam(params)
	if errBuild != nil {
		return nil, app.NewError(errBuild)
	}

	query := app.Db().Desc("id").Limit(queryParams.Limit, queryParams.Offset)

	// query title
	if _, ok := queryParams.Params["title"]; ok && queryParams.Params["title"] != "" {
		query.Where("title like ?", "%"+queryParams.Params["title"].(string)+"%")
	}

	data := make([]Merchants, 0)

	// 求总条数
	total, err := query.FindAndCount(&data)
	if err != nil {
		return nil, app.NewError(err)
	}

	returnData["data"] = data
	returnData["total"] = total

	return returnData, nil
}

// @title AddOrUpdate
// @description 更新或者添加 @todo 应该用事务!!!!
func (m *Merchants) AddOrUpdate(params MerchantAddParams, currentAdminUser *partner_admin_users.PartnerAdminUsers) (*Merchants, error) {

	m.MerchantName = params.Name
	m.Summary = params.Summary

	if m != nil && m.Id > 0 {
		affected, errUpdate := app.Db().ID(m.Id).Update(m)

		if errUpdate != nil {
			return nil, app.NewError(errUpdate)
		}

		if affected != 1 {
			return nil, app.NewError("更新错误")
		}
	} else {

		m.AddTime = time.Now().Unix()
		m.AddAdminId = currentAdminUser.Id
		affected, errInsert := app.Db().Insert(m)
		if errInsert != nil {
			return nil, app.NewError(errInsert)
		}

		if affected != 1 {
			return nil, app.NewError("新增内容分类错误(0x001)")
		}

		// @Todo 事务
		m.Sign = m.CreateSign()
		affected, errUpdate := app.Db().ID(m.Id).Cols("sign").Update(m)

		if errUpdate != nil {
			return nil, app.NewError(errUpdate)
		}

		if affected != 1 {
			return nil, app.NewError("更新错误")
		}
	}

	return m, nil
}

// 获取单个数据
// @param id int64 数据的id
// @return *Nodes, error
func GetItemById(id int64) (*Merchants, error) {
	node := new(Merchants)
	has, err := app.Engine.Where("id = ?", id).Get(node)

	if err != nil {
		return nil, err
	}

	if !has {
		return nil, app.NewError("对不起, 目标对象不存在")
	}

	return node, nil
}

// @title ModifyStatus
// @description 修改管理员状态
func (m *Merchants) ModifyStatus() (bool, error) {
	if m.Status == -1 {
		return false, app.NewError("对不起, 当前内容已经被删除!")
	}

	status := 1
	if m.Status == 1 {
		status = 0
	}

	affected, err := app.Db().Table(new(Merchants)).ID(m.Id).Cols("status").Update(map[string]int{"status": status})

	if err != nil {
		return false, app.NewError(err)
	}

	// 生效条数
	if affected == 0 {
		return false, app.NewError("对不起, 指定的ID更新数量不正确")
	}

	return true, nil
}

// @title DeleteItem
// @description 下架
func (m *Merchants) DeleteItem() error {

	if m.Status == -1 {
		return app.NewError("对不起, 当前内容已经被删除!")
	}

	m.Status = -1

	affected, errUpdate := app.Db().ID(m.Id).Cols("status").Update(m)

	if errUpdate != nil {
		return app.NewError(errUpdate)
	}

	if affected != 1 {
		return app.NewError("更新错误")
	}
	return nil
}

// @title CreateSign
// @description 创建商户 sign
func (m Merchants) CreateSign() string {
	return "QC" + strconv.FormatInt(m.Id+1260000000, 10)
}
